#ifndef __ETHERNET_H
#define __ETHERNET_H

#include <sys/sockets.h>

#define ETH_ALEN 6  // 以太网地址长度(字节)
#define ETHER_ADDR_LEN 6
#define ETH_P_ALL 0x0003  // 接收所有数据包

struct sockaddr_ll {
    unsigned short sll_family;   // 总是 AF_PACKET
    unsigned short sll_protocol; // 物理层协议类型（按网络字节序）
    int           sll_ifindex;   // 接口索引号
    unsigned short sll_hatype;   // ARP硬件类型
    unsigned char  sll_pkttype;  // 数据包类型
    unsigned char  sll_halen;    // 地址长度
    unsigned char  sll_addr[8];  // 物理层地址
};

#define PACKET_MR_PROMISC   1
#define PACKET_MR_MULTICAST 2   // 加入多播组
#define PACKET_MR_ALLMULTI  3   // 接收所有多播包

#define SOL_PACKET 263  /* 在Linux内核中通常定义为263 */

#define PACKET_ADD_MEMBERSHIP 1

struct packet_mreq {
    int            mr_ifindex;    /* 接口索引号 */
    unsigned short mr_type;       /* 成员关系类型 */
    unsigned short mr_alen;       /* 地址长度 */
    unsigned char  mr_address[8]; /* 物理地址 */
};

#define IFNAMSIZ 16

struct ifreq {
    char ifr_name[IFNAMSIZ]; /* 接口名称 */
    union {
        struct sockaddr ifr_addr;      // IP地址
        struct sockaddr ifr_dstaddr;   // 目标地址
        struct sockaddr ifr_broadaddr; // 广播地址
        struct sockaddr ifr_netmask;   // 子网掩码
        struct sockaddr ifr_hwaddr;    // MAC地址
        short          ifr_flags;     // 接口标志
        int            ifr_ifindex;    // 接口索引
        int            ifr_metric;     // 路由度量
        int            ifr_mtu;        // MTU值
        char           ifr_slave[IFNAMSIZ]; // 从属设备
        char           ifr_newname[IFNAMSIZ]; // 新名称
        char          *ifr_data;       // 扩展数据指针
    };
};

#define SIOCGIFHWADDR 0x8927

#endif

